Amazon Bedrock AgentsとAWS Chatbotを使用したSlack生成AIチャットボットをCloudFormationで実装してみた
こんにちは、つくぼし(tsukuboshi0755)です!
少し前になりますが、AWS ChatbotがMicrosoft TeamsやSlackからのAmazon Bedrock Agentsとのやり取りに対応したというアップデートがありました。
今回はこちらの機能を用いつつ、さらに簡単に設定できるようCloudFormationでSlack生成AIチャットボットを実装してみたので、その手順をご紹介します!
アーキテクチャ解説
今までのアップデートと比較して、今回のアップデートを用いた構成がどのようなメリットを持つかについて解説します。
このアップデートが出る前まで、SlackまたはTeamsでBedrock ModelやBedrock Agentsを呼び出すには、バックエンド連携部分の開発が必須になっていました。
例えばバックエンドにECSを用いる場合は以下のような構成になり、アプリケーションコードの開発や運用について別途検討する必要がありました。
しかし今回のアップデートが出現した事で、バックエンド連携部分をChatbotで簡単に設定できるようになりました。
その結果、以下のような構成を用いる事で、アプリケーションコードの開発なしでBedrock Agentsを呼び出す事ができるようになっています。
上記構成を用いる事で、主に以下2点のメリットが生まれます。
- アプリケーション開発に不慣れな方でも、気軽にSlackまたはTeams上で生成AIチャットボットを実装可能
- Bedrock Agentsを呼び出すため、Knowledge BasesやAction Groups等の設定を追加する事で、RAGや外部APIの呼び出しといった機能拡張が容易に可能
これにより、簡単かつ拡張性の高い生成AIチャットボットを実装できるようになっています!
構築手順
今回の構築手順では、Slack生成AIチャットボットに必要な最小限のBedrock Agents設定のみで実装してみます。
Bedrockモデルアクセスの有効化
もしBedrock Agentsで使用するモデルを有効化していない場合、以下を参考にモデルを有効化してください。
SlackチャンネルIDの取得
生成AIチャットボットからメッセージを投稿する際に、チャンネルIDが必要になります。
事前に該当のSlackチャンネルの詳細を開き、下の方からコピーしてください。
AWS Chatbotでのチャットクライアント設定
次にAWS Chatbotコンソールから、Chatbotでチャットクライアントを設定します。
コンソールのトップページのチャットクライアントをSlack
に設定した後、クライアントを設定
ボタンをクリックしてください。
次にSlack認証ページでワークスペースにアクセスするため、許可する
ボタンをクリックしてください。
以下の設定済みクライアントページが表示されれば、チャットクライアントの設定は完了です。
ワークスペースIDをCloudFormationのパラメータに設定するため、ここでコピーしておいてください。
CloudFormationスタックのデプロイ
続いてCloudFormationコンソールから、生成AIチャットボットに必要なBedrock Agents及びChatbotチャネルを構築するためのスタックをデプロイします。
以下のCloudFormationテンプレートをYAML形式で、ローカルに保存してください。
template.yaml
Parameters:
FoundationModeId:
Type: String
Description: The Id of the foundation model.
Default: "anthropic.claude-3-5-sonnet-20240620-v1:0"
SlackChannelId:
Type: String
Description: The ID of the Slack channel.
NoEcho: true
SlackWorkspaceId:
Type: String
Description: The ID of the Slack workspace.
NoEcho: true
Resources:
BedrockAgentPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName: !Sub "AmazonBedrockExecutionPolicyForAgents_${AWS::StackName}"
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- bedrock:InvokeModel
Resource:
- !Sub arn:aws:bedrock:${AWS::Region}::foundation-model/${FoundationModeId}
BedrockAgentRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub "AmazonBedrockExecutionRoleForAgents_${AWS::StackName}"
ManagedPolicyArns:
- !Ref BedrockAgentPolicy
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service: bedrock.amazonaws.com
Action: sts:AssumeRole
Condition:
StringEquals:
aws:SourceAccount: !Ref "AWS::AccountId"
ArnLike:
aws:SourceArn: !Sub "arn:aws:bedrock:${AWS::Region}:${AWS::AccountId}:agent/*"
BedrockAgent:
Type: AWS::Bedrock::Agent
Properties:
AgentName: !Sub "${AWS::StackName}-agent"
AgentResourceRoleArn: !GetAtt BedrockAgentRole.Arn
FoundationModel: !Ref FoundationModeId
Instruction: "あなたはSlack用のチャットボットです。ユーザーと同じ言語で、親切に応対してください。"
AutoPrepare: true
BedrockAgentAlias:
Type: AWS::Bedrock::AgentAlias
Properties:
AgentAliasName: !Sub "${AWS::StackName}-agent-alias-v1"
AgentId: !Ref BedrockAgent
ChatbotRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub ${AWS::StackName}-chatbot-role
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service: "chatbot.amazonaws.com"
Action: "sts:AssumeRole"
ManagedPolicyArns:
- !Ref ChatbotPolicy
ChatbotPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName: !Sub ${AWS::StackName}-chatbot-policy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action:
- "Bedrock:InvokeAgent"
Resource: !GetAtt BedrockAgentAlias.AgentAliasArn
SlackChatbot:
Type: AWS::Chatbot::SlackChannelConfiguration
Properties:
ConfigurationName: !Sub ${AWS::StackName}-slack-chatbot
IamRoleArn: !GetAtt ChatbotRole.Arn
LoggingLevel: INFO
SlackChannelId: !Ref SlackChannelId
SlackWorkspaceId: !Ref SlackWorkspaceId
Outputs:
AgentArn:
Description: The ARN of the agent.
Value: !GetAtt BedrockAgent.AgentArn
AgentAliasId:
Description: The ID of the agent alias.
Value: !GetAtt BedrockAgentAlias.AgentAliasId
テンプレートを保存したら、CloudFormationコンソールでスタックを作成していきます。
CloudFormationコンソールでのスタックの作成方法については、以下の公式ドキュメントを参考にしてください。
CloudFormationコンソールでスタックの作成を実施し、保存したテンプレートをアップロードします。
以下のスタックの詳細画面では、スタック名及びパラメータを指定する必要があります。
スタック名に任意の名前を入力した後、以下の通りパラメータの設定を行います。
パラメータ名 | 説明 | 備考 |
---|---|---|
FoundationModeId | Amazon Bedrock Agentsで使用するFoundation Model ID | デフォルトはanthropic.claude-3-5-sonnet-20240620-v1:0 |
SlackChannelId | SlackチャンネルID | 先ほどSlackで取得したチャンネルIDを入力 |
SlackWorkspaceId | SlackワークスペースID | 先ほどChatbotコンソールで取得したワークスペースIDを入力 |
パラメータの内容に問題がなければ、スタックをデプロイします。
スタックのデプロイが完了したら、以下の通り出力タブからAgentArn
とAgentAliasId
の値を各々コピーしておいてください。
Slackでのコネクタ設定
最後にSlack上で生成AIチャットボットとのコネクタを設定します。
該当のSlackチャンネルで、以下のメッセージを送信してください。
コネクター名は任意の名前でOKです。
Bedrock AgentsのエージェントARNとエイリアスIDは、先ほどCloudFormationコンソールで取得したものを入力してください。
@aws connector add {コネクター名} {Bedrock Agentsのエージェント ARN} {Bedrock AgentsのエイリアスID}
以下のメッセージが表示されれば、コネクターの設定は完了です。
テスト
最後にSlack上で生成AIチャットボットをテストしてみます。
以下のメッセージを送信し、生成AIチャットボットが正常に応答するか確認してください。
質問は任意の内容でOKです。
@aws ask {コネクター名} {質問}
以下の通り正常にメッセージが返ってきれば、生成AIチャットボットの設定は完了です!
慣れてきたらBedrock AgentsにKnowledge BasesやAction Groups等の設定を追加し、ぜひ機能拡張してみてください!
最後に
今回はAWS ChatbotとAmazon Bedrock Agentsを用いて、CloudFormationでSlack生成AIチャットボットを実装してみました。
このアップデートにより、とてもシンプルな形でAWS上に生成AIチャットボットを構築できるようになっています。
さらにAgentsの設定をカスタマイズする事でRAGや外部APIを呼び出せるようになるため、拡張性にも優れています。
ぜひこの記事を参考に、Slack上での新しい生成AIチャットボットの実装を試してみてください!
以上、つくぼし(tsukuboshi0755)でした!